<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="YMDVB" id="YMDVB"><span data-lake-id="u326390c3" id="u326390c3">典型回答</span></h1>
  <p data-lake-id="u6a96597a" id="u6a96597a"><br></p>
  <p data-lake-id="ucf8b5767" id="ucf8b5767"><span data-lake-id="u09cdbd0d" id="u09cdbd0d">数据库死锁问题是指在多个并发事务中，彼此之间出现了相互等待的情况，导致所有事务都无法继续执行，称为死锁。</span></p>
  <p data-lake-id="uae192cd9" id="uae192cd9"><span data-lake-id="ub9c77155" id="ub9c77155">​</span><br></p>
  <p data-lake-id="u60d6415e" id="u60d6415e"><span data-lake-id="u54dcb42b" id="u54dcb42b">关于死锁的概念：</span></p>
  <p data-lake-id="uf9b29725" id="uf9b29725"><br></p>
  <p data-lake-id="u7a56f38b" id="u7a56f38b"><span data-lake-id="uaff09ed0" id="uaff09ed0">数据库的死锁的发生通常由以下原因导致：</span></p>
  <ol list="u768140d2">
   <li fid="u6ae9b660" data-lake-id="u18944b87" id="u18944b87" data-lake-index-type="true"><span data-lake-id="u787a7ee3" id="u787a7ee3">资源竞争：多个事务试图同时访问相同的资源，如数据库表、行、页或锁。但是它们请求资源的顺序不同，导致互相等待。</span></li>
   <li fid="u6ae9b660" data-lake-id="uef9a4930" id="uef9a4930" data-lake-index-type="true"><span data-lake-id="u45f08a11" id="u45f08a11">未释放资源</span><span data-lake-id="ucfd870e8" id="ucfd870e8">：事务在使用完资源后未及时释放资源，导致其他事务无法获得所需的资源。这可能是由于程序中的错误或异常情况引起的。</span></li>
   <li fid="u6ae9b660" data-lake-id="u02385e5a" id="u02385e5a" data-lake-index-type="true"><span data-lake-id="u7fe8eb04" id="u7fe8eb04">不同事务的执行速度不同</span><span data-lake-id="ua2dc99e9" id="ua2dc99e9">：如果一个事务在获取资源后执行速度很慢，而其他事务需要等待该事务释放资源，那么可能会导致其他事务超时，从而发生死锁。</span></li>
   <li fid="u6ae9b660" data-lake-id="u0c7fe212" id="u0c7fe212" data-lake-index-type="true"><span data-lake-id="u8726b949" id="u8726b949">操作的数据量过大：在持有锁的同时，又请求获取更多的锁，导致互相等待。</span></li>
  </ol>
  <p data-lake-id="u4d9ef087" id="u4d9ef087"><span data-lake-id="ucceced74" id="ucceced74">​</span><br></p>
  <p data-lake-id="ub49e6d38" id="ub49e6d38"><span data-lake-id="u05e75b9c" id="u05e75b9c">解决（避免）死锁的方法有：</span></p>
  <p data-lake-id="u71f9c10e" id="u71f9c10e"><span data-lake-id="uf1f83a4e" id="uf1f83a4e">1、减少锁的数量：比如使用RC来代替RR来避免因为gap锁和next-key锁而带来的死锁情况。</span></p>
  <p data-lake-id="ufb524ce1" id="ufb524ce1"><span data-lake-id="u215097ae" id="u215097ae">2、减少锁的时长：加快事务的执行速度，降低执行时间，也能减少死锁发生的概率。</span></p>
  <p data-lake-id="u91463a22" id="u91463a22"><span data-lake-id="udefef193" id="udefef193">3、固定顺序访问数据：事务在访问同一张表时，应该以相同的顺序获取锁，这样可以避免死锁的发生。</span></p>
  <p data-lake-id="u5f6cc4fd" id="u5f6cc4fd"><span data-lake-id="u8a147c80" id="u8a147c80">4、减少操作的数据量：尽量减少事务操作的数据量，尽量减少事务的持有时间，这样可以降低死锁的发生几率。</span></p>
  <p data-lake-id="ubab59149" id="ubab59149"><br></p>
 </body>
</html>